package org.example.manySheetExcel;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.List;

/**
 * @author 望轩
 * @createDate 2025/8/20 15:13
 * 导出excel模板，或者导出数据库中的数据到excel文件中
 */
public class ExportTemplateWithManySheetExample {
    public static void main(String[] args) {
        // 准备数据；我这里的做的是导出excel模板，如果是导出数据库中的数据，需要先查询数据库中的DO数据，然后再转化为DTO数据，
        // 我们获取到RegionDTOList数据之后，多sheet工作簿的导出就和下面的差不多了。只不过我们需要根据每个sheet工作簿需要的数据
        // 去针对性的创建一个sheet工作簿
        List<RegionDTO> regionData = Arrays.asList(
                new RegionDTO("Europe", "欧洲", null, 1, "AREA"),
                new RegionDTO("Albania", "阿尔巴尼亚", "AL", 2, "COUNTRY"),
                new RegionDTO("Algeria", "阿尔及利亚", "DZ", 2, "COUNTRY")
        );

        try (Workbook workbook = new XSSFWorkbook()) {
            // 创建表头样式（黄色背景，居中）
            CellStyle headerStyle = createHeaderStyle(workbook);
            // 创建数据样式（居中，自动换行）
            CellStyle dataStyle = createDataStyle(workbook);

            // 创建两个Sheet并填充数据
            createSheet(workbook, "区域数据1", regionData, headerStyle, dataStyle);
            createSheet(workbook, "区域数据2", regionData, headerStyle, dataStyle);

            // 导出Excel文件
            try (FileOutputStream fos = new FileOutputStream("D:/RegionTemplate.xlsx")) {
                workbook.write(fos);
                System.out.println("Excel模板生成成功！文件路径: RegionTemplate.xlsx");
            }
        } catch (Exception e) {
            System.err.println("生成Excel失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    // 创建表头样式（黄色背景，居中）
    private static CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置黄色背景
        style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 设置居中（水平和垂直）
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        // 设置字体（加粗）
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);

        // 设置细边框
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);

        return style;
    }

    // 创建数据样式（居中，自动换行）
    private static CellStyle createDataStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置居中（水平和垂直）
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        // 设置自动换行（实现行高自适应）
        style.setWrapText(true);

        // 设置细边框
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);

        return style;
    }

    // 创建Sheet并填充数据
    private static void createSheet(Workbook workbook, String sheetName,
                                    List<RegionDTO> data,
                                    CellStyle headerStyle, CellStyle dataStyle) {
        Sheet sheet = workbook.createSheet(sheetName);

        // 创建表头行（黄色背景）
        Row headerRow = sheet.createRow(0);
        String[] headers = {"Name", "NameCn", "Code", "RegionLevel", "Type"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(headerStyle);
        }

        // 填充数据行
        for (int i = 0; i < data.size(); i++) {
            RegionDTO dto = data.get(i);
            Row row = sheet.createRow(i + 1);

            // 填充单元格数据并应用样式
            createCell(row, 0, dto.getName(), dataStyle);
            createCell(row, 1, dto.getNameCn(), dataStyle);
            createCell(row, 2, dto.getCode() != null ? dto.getCode() : "", dataStyle);
            createCell(row, 3, String.valueOf(dto.getRegionLevel()), dataStyle);
            createCell(row, 4, dto.getType(), dataStyle);
        }

        // 自适应列宽（处理中文宽度问题）
        for (int i = 0; i < headers.length; i++) {
            sheet.autoSizeColumn(i);
            // 增加额外宽度以适配中文[7](@ref)
            int columnWidth = sheet.getColumnWidth(i);
            sheet.setColumnWidth(i, (int)(columnWidth * 1.3));
        }

        // 设置行高自适应[7](@ref)
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            if (row != null) {
                row.setHeight((short)-1); // 启用自动行高
            }
        }
    }

    // 创建单元格辅助方法
    private static void createCell(Row row, int column, String value, CellStyle style) {
        Cell cell = row.createCell(column);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }

}

